Projekt Pronal Projekt Pronal

Kazalo:
Sofinasiranje projekta
Starejši - učbenik...
Starejši - zbirka nalog...
Tekmovanja...
Tekmovanja - Parsons...
Tekmovanja - popravi...
Tekmovanja - dopolni
rtk 1988
rtk 1996
rtk 1998
rtk 1999
rtk 2000
rtk 2001
rtk 2002
rtk 2004
rtk 2006
rtk 2007
rtk 2008
rtk 2009
rtk 2013
rtk 2014
rtk 2016
rtk 2017
rtk 2018
rtk 2000

rtk 2000


2000.1.1 (dopolni)

1. podnaloga

Starejši si, kot misliš! Koliko sekund je minilo med začetkom (0 h) dneva, v katerem si se rodil, in začetkom današnjega dneva? Na prvi pogled se zdi, da jih je 24 * 60 * 60 * število dni med obema datumoma. To je skoraj res, ušteli smo se le za kakšen ducat sekund. To so tako imenovane prestopne sekunde, ki so vrinjene po potrebi vsakih nekaj let. Več o tem si lahko prebereš na Wikipediji.

Seznam datumov, ko so bile vrinjene prestopne sekunde, je na voljo spodaj. Vsak element seznama je datum (leto-mesec-dan) tik po tem, ko je bila ob polnoči vrinjena prestopna sekunda.

datumi = ['1972-07-01','1973-01-01','1974-01-01','1975-01-01',
          '1976-01-01','1977-01-01','1978-01-01','1979-01-01',
          '1980-01-01','1981-07-01','1982-07-01','1983-07-01',
          '1985-07-01','1988-01-01','1990-01-01','1991-01-01',
          '1992-07-01','1993-07-01','1994-07-01','1996-01-01',
          '1997-07-01','1999-01-01','2006-01-01','2009-01-01',
          '2012-07-01','2015-07-01','2017-01-01']

Naloga

Dopolni funkcijo sekunde(rojstni_dan, danes), ki prebere rojstni datum (kot niz 10 znakov: leto-mesec-dan), in današnji datum, ter s pomočjo seznama prestopnih sekund izračuna in vrne število sekund, ki je minilo med obema datumoma. Sekund rojstnega dneva ne šteje. Mesto dopolnjevanja je označeno z ###.

from datetime import date

def pretvori_datum(datum):
    '''pretvori datum iz niza v objekt date'''

    leto, mesec, dan = ###, datum[5:7], datum[8:]
    return date(int(leto), int(mesec), ###)


def sekunde(rojstni_dan, danes):

    datumi = ['1972-07-01','1973-01-01','1974-01-01','1975-01-01',
    '1976-01-01','1977-01-01','1978-01-01','1979-01-01',
    '1980-01-01','1981-07-01','1982-07-01','1983-07-01',
    '1985-07-01','1988-01-01','1990-01-01','1991-01-01',
    '1992-07-01','1993-07-01','1994-07-01','1996-01-01',
    '1997-07-01','1999-01-01','2006-01-01','2009-01-01',
    '2012-07-01','2015-07-01','2017-01-01']

    rojstni_datum = pretvori_datum(rojstni_dan)
    danasnji_datum = pretvori_datum(danes)
    stevilo_dni = ###.days

    prestopne_sekunde = 0
    for datum in datumi:
        d = pretvori_datum(datum)
        if (d - rojstni_datum).days ### 0 and (d - danasnji_datum).days ### 0:
            prestopne_sekunde += 1
    return stevilo_dni * ### + prestopne_sekunde

Vhodni podatki

Datum rojstva in današnji datum v obliki niza: leto-mesec-dan.

Izhodni podatki

Število sekund, ki je minilo med obema datuma.

Primer

Vhod
>>> sekunde('1998-05-03','2018-06-24')
Izhod
635644806

Uradna rešitev

from datetime import date

def pretvori_datum(datum):
    '''pretvori datum iz niza v objekt date'''

    leto, mesec, dan = datum[:4], datum[5:7], datum[8:]
    return date(int(leto), int(mesec), int(dan))


def sekunde(rojstni_dan, danes):

    datumi = ['1972-07-01','1973-01-01','1974-01-01','1975-01-01',
    '1976-01-01','1977-01-01','1978-01-01','1979-01-01',
    '1980-01-01','1981-07-01','1982-07-01','1983-07-01',
    '1985-07-01','1988-01-01','1990-01-01','1991-01-01',
    '1992-07-01','1993-07-01','1994-07-01','1996-01-01',
    '1997-07-01','1999-01-01','2006-01-01','2009-01-01',
    '2012-07-01','2015-07-01','2017-01-01']

    rojstni_datum = pretvori_datum(rojstni_dan)
    danasnji_datum = pretvori_datum(danes)
    stevilo_dni = (danasnji_datum - rojstni_datum).days

    prestopne_sekunde = 0
    for datum in datumi:
        d = pretvori_datum(datum)
        if (d - rojstni_datum).days > 0 and (d - danasnji_datum).days <= 0:
            prestopne_sekunde += 1
    return stevilo_dni * 24 * 60 * 60 + prestopne_sekunde

2000.1.2 (dopolni)

1. podnaloga

Operacijski sistem skrbi za dodeljevanje pomnilnika procesom, ki tečejo na njem. Zaželeno je, da ima ta postopek takšne lastnosti, da je dodeljevanje in sproščanje pomnilnika hitro, njegova razdrobljenost majhna, knjigovodski podatki sistema o kosih pomnilnika pa hitro dosegljivi in neobsežni. Nekaterim takšnim lastnostnim ustreza metoda dodeljevanja, pri kateri sistem daje pomnilnik na voljo v kosih, velikih po $2^n$ bajtov: 1 bajt, 2 bajta, 4 bajte, 8 bajtov. . .

Naloga

Dopolni funkcijo pomnilnik(m), ki bo za dano število m zaprošenih bajtov vrnila velikost dodeljenega pomnilnika kot število, zaokroženo na prvo potenco števila 2, ki ni manjša od m. Mesto dopolnjevanja je označeno z ###.

def pomnilnik(m):

    if ###:
        return 0

    pomnilnik = ###
    while pomnilnik < m:
        pomnilnik = ###
    return pomnilnik

Vhodni podatki

Število zaprošenih bajtom pomnilnika.

Izhodni podatki

Število bajtov dodeljenega pomnilnika.

Primer

Vhod
>>> pomnilnik(9)
Izhod
16

Uradna rešitev

def pomnilnik(m):

    if m == 0:
        return 0

    pomnilnik = 1
    while pomnilnik < m:
        pomnilnik = pomnilnik * 2
    return pomnilnik

2000.1.3 (dopolni)

1. podnaloga

Bliža se konec šolskega leta in čas je, da učitelji zaključijo ocene. Napisali so funkcijo, ki prebere ocene in vrne podatek o uspehu (pozitiven ali negativen). Če je uspeh pozitiven, izpiše tudi povprečno oceno, zaokroženo na eno decimalno mesto. Za vsak predmet je podana ena ocena, ki je celo število med 1 in 5. Uspeh je negativen, če je vsaj en predmet ocenjen z 1, sicer pa pozitiven.

Naloga

Dopolni funkcijo ocene(sez) tako, da bo delovala kot je opisano zgoraj. Mesto dopolnjevanja je označeno z ###.

def ocene(sez):
    '''Vrne podatek o zaključnem uspehu (pozitiven ali negativen) in povprečno
oceno v primeru, da je uspeh pozitiven.'''

    stevilo_ocen = ###
    vsota = 0
    for ocena in sez:
        if ###:
            return 'Uspeh je negativen.'
        else:
            ###
    povprecje = round(vsota / stevilo_ocen, 1)
    return 'Uspeh je pozitiven. Povprečna ocena je ' + ### + '.'

Vhodni podatki

Seznam ocen.

Izhodni podatki

'Uspeh je negativen.', če je končni uspeh negativen in 'Uspeh je pozitiven. Povprečna ocena je 4.5.', če je končni uspeh pozitven, povprečna ocena pa je 4.5.

Primer

>>> ocene([2,3,3,4,3,2,4,5,4,3])
'Uspeh je pozitiven. Povprečna ocena je 3.3.'

>>> ocene([1,5,2,3,4])
'Uspeh je negativen.'

Uradna rešitev

def ocene(sez):
    '''Vrne podatek o zaključnem uspehu (pozitiven ali negativen) in povprečno
    oceno v primeru, da je uspeh pozitiven.'''

    stevilo_ocen = len(sez)
    vsota = 0
    for ocena in sez:
        if ocena == 1:
            return 'Uspeh je negativen.'
        else:
            vsota += ocena
    povprecje = round(vsota / stevilo_ocen, 1)
    return 'Uspeh je pozitiven. Povprečna ocena je ' + str(povprecje) + '.'

2000.1.4 (dopolni)

1. podnaloga

Janez ima na svojem računalniku podatkovno zbirko s celotnim seznamom svojih CDjev. Za vsak CD ima podatke o izvajalcu, naslov CDja in seznam vseh skladb na CDju. Zdaj želi svoj seznam, ki je že urejen po izvajalcu in imenu albuma, izpisati na lepši način, tako da se pri izpisu ne bodo po nepotrebnem ponavljala imena izvajalcev in naslovi albumov.

Naloga

Pomagaj mu dopolniti funkcijo glasba(skladbe), ki bo naredila, kar si Janez želi. Mesto dopolnjevanja je označeno z ###. Pri tem naj funkcija pazi, da je med imenom izvajalca in imenom albuma ter med imenom albuma in naslovom skladbe vedno vsaj za dva presledka prostora, stolpci pa naj bodo vsi levo poravnani. Vrstica je lahko poljubno dolga, naj pa ne bo daljša, kot je potrebno.

def glasba(skladbe):
    '''Uredi izpise podatkov o skladbah.'''

    max_izvajalec = 0
    max_album = 0
    max_naslov = 0
    for skladba in skladbe:
        izvajalec, album, naslov = ###
        if len(izvajalec) > max_izvajalec:
            ###
        if len(album) > max_album:
            max_album = len(album)
        if len(naslov) > max_naslov:
            max_naslov = len(naslov)

    izpis = ''
    trenutni_izvajalec = ''
    trenutni_album = ''
    for skladba in skladbe:
        izvajalec, album, naslov = ###
        d_izvajalec = len(izvajalec)
        d_album = len(album)
        d_naslov = len(naslov)

        if izvajalec ### trenutni_izvajalec:
            trenutni_izvajalec = izvajalec
            izpis += izvajalec + '{0}'.format(###)
        else:
            izpis += '{0}'.format(###)

        if album != trenutni_album:
            trenutni_album = album
            izpis += album + '{0}'.format(###)
        else:
            izpis += '{0}'.format(###)

        izpis += ###
        izpis += ###
    return izpis

Vhodni podatki

Seznam skladb s podatki o izvajalcu in naslovom CDja.

Izhodni podatki

Niz urejenih podatkov o skladbah.

Primer

Vhod
>>> glasba(['Blesavi bend, 3 lahki komadi, Moja prva ljubezen',
            'Blesavi bend, 3 lahki komadi, Moja druga ljubezen',
            'Blesavi bend, 3 lahki komadi, Moja zadnja ljubezen',
            'Blesavi bend, Singl, Tristo kosmatih',
            'Nori fantje, Najvecji neuspehi, Spet si sla k drugemu'])
Izhod s funkcijo print
 Blesavi bend  3 lahki komadi     Moja prva ljubezen
                                  Moja druga ljubezen
                                  Moja zadnja ljubezen
               Singl              Tristo kosmatih
 Nori fantje   Najvecji neuspehi  Spet si sla k drugemu
Izhod programa
'Blesavi bend  3 lahki komadi     Moja prva ljubezen\n
              Moja druga ljubezen\n                                 Moja
 zadnja ljubezen\n              Singl              Tristo kosmatih\nNori
 fantje   Najvecji neuspehi  Spet si sla k drugemu\n'
Komentar

Do željene oblike izpisa pridemo s funkcijo print, vendar Tomo preverja kaj funkcija vrne, zato na koncu programa uporabimo return. Seveda se lahko z ukazom print pred tem prepričamo, kako izgleda izpis.

Uradna rešitev

def glasba(skladbe):
    '''Uredi izpise podatkov o skladbah.'''


# V prvem prehodu skozi vse podatke si le zapomnimo dolžino najdaljšega imena
# izvajalca, naslova albuma in naslova skladbe, da bomo kasneje lahko podatke
# pri izpisu lepo poravnali v stolpce.
    max_izvajalec = 0
    max_album = 0
    max_naslov = 0
    for skladba in skladbe:
        izvajalec, album, naslov = skladba.split(', ')
        if len(izvajalec) > max_izvajalec:
            max_izvajalec = len(izvajalec)
        if len(album) > max_album:
            max_album = len(album)
        if len(naslov) > max_naslov:
            max_naslov = len(naslov)

# V drugem prehodu beremo zapise enega za drugim in če ima nek zapis istega
# izvajalca in album kot prejšnji, moramo izpisati le naslov skladbe.
    izpis = ''
    trenutni_izvajalec = ''
    trenutni_album = ''
    for skladba in skladbe:
        izvajalec, album, naslov = skladba.split(', ')
        d_izvajalec = len(izvajalec)
        d_album = len(album)
        d_naslov = len(naslov)

        if izvajalec != trenutni_izvajalec:
            trenutni_izvajalec = izvajalec
            izpis += izvajalec + '{0}'.format(' ' * (max_izvajalec - d_izvajalec + 2))
        else:
            izpis += '{0}'.format(' ' * (max_izvajalec + 2))

        if album != trenutni_album:
            trenutni_album = album
            izpis += album + '{0}'.format(' ' * (max_album - d_album + 2))
        else:
            izpis += '{0}'.format(' ' * (max_album + 2))

        izpis += naslov
        izpis += '\n'
    return izpis
Mesto objave ob koncu projekta 15.9.2018